import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import router from '@/router'

// create an axios instance
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url请求基地址
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000 // request timeout请求超时时间
})
const time = 24 * 60 * 60 * 1000// token有效时长
// 请求拦截器
service.interceptors.request.use((config) => {
  // 统一设置token
  const token = store.state.user.token
  if (token) {
    if (config.url === '/auth/local/register') {
      config.headers.Authorization = ''
      return config
    } else {
      config.headers.Authorization = `Bearer ${token}`
    }
    // token过期处理
    const curTime = Date.now()// 当前时间戳
    // 登录时间戳
    const loginTime = localStorage.getItem('loginTime')
    // 当两个时间戳相比较
    if (curTime - loginTime > time) {
      // 超时了
      store.dispatch('user/logout')
      // 跳转到登录页面
      router.push('/login')
      // 返回一个错误信息，阻止请求的继续执行
      return Promise.reject(new Error('登录超时，请求重新登录'))
    }
    // 注意：Bearer和token之间一定要有空格
    config.headers.Authorization = `Bearer ${token}`
  }
  return config // 放行
})

// response interceptor
service.interceptors.response.use((response) => {
  return response// 放行
}, (error) => {
  // 网络层面失败 -- 触发这个函数
  // 比如：请求超时的时候，就会出现网络层面失败
  // console.log('网络层面失败', error)
  console.dir(error)
  // 处理token过期问题
  if (error.response.data.statusCode === 401) {
    store.dispatch('user/logout')
    router.push('/login')
    Message.error('登录超时，请重新登录！')
  }
  Message.error(error.message)
  return Promise.reject(error)
})

export default service
